home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / util / gnu / groff_src.lha / Groff-1.07 / libgroff / tmpfile.cc < prev   
C/C++ Source or Header  |  1992-08-25  |  3KB  |  100 lines

  1. // -*- C++ -*-
  2. /* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
  3.      Written by James Clark (jjc@jclark.com)
  4.  
  5. This file is part of groff.
  6.  
  7. groff is free software; you can redistribute it and/or modify it under
  8. the terms of the GNU General Public License as published by the Free
  9. Software Foundation; either version 2, or (at your option) any later
  10. version.
  11.  
  12. groff is distributed in the hope that it will be useful, but WITHOUT ANY
  13. WARRANTY; without even the implied warranty of MERCHANTABILITY or
  14. FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  15. for more details.
  16.  
  17. You should have received a copy of the GNU General Public License along
  18. with groff; see the file COPYING.  If not, write to the Free Software
  19. Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
  20.  
  21. #include <stdio.h>
  22. #include <errno.h>
  23. #include <string.h>
  24. #include <stdlib.h>
  25.  
  26. #include "posix.h"
  27. #include "lib.h"
  28. #include "errarg.h"
  29. #include "error.h"
  30.  
  31. extern "C" {
  32.   // Sun's stdlib.h fails to declare this.
  33.   char *mktemp(char *);
  34.   int mkstemp(char *);
  35. }
  36.  
  37. // If this is set, create temporary files there
  38. #define GROFF_TMPDIR_ENVVAR "GROFF_TMPDIR"
  39. // otherwise if this is set, create temporary files there
  40. #define TMPDIR_ENVVAR "TMPDIR"
  41. // otherwise create temporary files here.
  42. #define DEFAULT_TMPDIR "/tmp"
  43. // Use this as the prefix for temporary filenames.
  44. #define TMPFILE_PREFIX  "groff"
  45.  
  46. // Open a temporary file with fatal error on failure.
  47.  
  48. FILE *xtmpfile()
  49. {
  50.   const char *dir = getenv(GROFF_TMPDIR_ENVVAR);
  51.   if (!dir) {
  52.     dir = getenv(TMPDIR_ENVVAR);
  53.     if (!dir)
  54.       dir = DEFAULT_TMPDIR;
  55.   }
  56.   
  57.   const char *p = strrchr(dir, '/');
  58.   int needs_slash = (!p || p[1]);
  59.   char *templ = new char[strlen(dir) + needs_slash
  60.                 + sizeof(TMPFILE_PREFIX) - 1 + 6 + 1];
  61.   strcpy(templ, dir);
  62.   if (needs_slash)
  63.     strcat(templ, "/");
  64.   strcat(templ, TMPFILE_PREFIX);
  65.   strcat(templ, "XXXXXX");
  66.  
  67. #ifdef HAVE_MKSTEMP
  68.   errno = 0;
  69.   int fd = mkstemp(templ);
  70.   if (fd < 0)
  71.     fatal("cannot create temporary file: %1", strerror(errno));
  72.   errno = 0;
  73.   FILE *fp = fdopen(fd, "w+");
  74.   if (!fp)
  75.     fatal("fdopen: %1", strerror(errno));
  76. #else /* not HAVE_MKSTEMP */
  77.   if (!mktemp(templ) || !templ[0])
  78.     fatal("cannot create file name for temporary file");
  79.   errno = 0;
  80.   FILE *fp = fopen(templ, "w+");
  81.   if (!fp)
  82.     fatal("cannot open `%1': %2", templ, strerror(errno));
  83. #endif /* not HAVE_MKSTEMP */
  84.   if (unlink(templ) < 0)
  85.     error("cannot unlink `%1': %2", templ, strerror(errno));
  86.   a_delete templ;
  87.   return fp;
  88. }
  89.  
  90. #if 0
  91. // If you're not running Unix, the following will do:
  92. FILE *xtmpfile()
  93. {
  94.   FILE *fp = tmpfile();
  95.   if (!fp)
  96.     fatal("couldn't create temporary file");
  97.   return fp;
  98. }
  99. #endif
  100.